from numpy import *
from math import *

# FUNCIONES:
# Muestra la matriz en pantalla de manera más estética
def print_matriz(matriz):
    output = ""
    for fila in matriz:
        for elemento in fila:
                output += f"{elemento:10.2f}"
        output += '\n'
    print(output)

# De una matriz, resuelve una columna por eliminación gaussiana y devuelve la matriz
def columnear(matriz, columna):
    n_filas = len(matriz)
    for j in range(n_filas -1 -columna):
        j += 1 + columna
        matriz[j] = matriz[j]-matriz[columna]*(matriz[j][columna]/matriz[columna][columna])
    return matriz

# Resuelve toda la matriz del sistema columna por columna y devuelve matriz triangular superior
def matriz_gaussiana(matriz):
    n_columnas = len(matriz[0])
    print_matriz(matriz)
    for i in range(n_columnas - 2):
        columnear(matriz, i)
        print_matriz(matriz)
    return matriz

# Ejercicio 2 -----------------------------------------------------------------
"""
Sistema en forma:

a00*x1 + a01*x2 + a02*x3 + a03*x4 = a04
a10*x1 + a11*x2 + a12*x3 + a13*x4 = a14
a20*x1 + a21*x2 + a22*x3 + a23*x4 = a24
a30*x1 + a31*x2 + a32*x3 + a33*x4 = a34
"""

# Construcción de la matriz del sistema
a = array([[6, -2, 2, 4], [12, -8, 6, 10], [3, -13, 9, 5], [-6, 4, 1, -2]])
b = array([[12], [18], [-30], [-9]])
A = hstack((a, b))
A = array(A, dtype=float)

print("Ejercicio 2 " + "="*50 + "\n")
matriz_gaussiana(A)